iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
自我挑戰組

JS 作品實戰應用 - Vue 電商網站系列 第 13

13. Promise概念與串接

  • 分享至 

  • xImage
  •  

Promise 基本概念

https://ithelp.ithome.com.tw/upload/images/20200928/20121004fIJfJ1U1dG.jpg
Promise 主要是來解決非同步問題,非同步行為沒辦法確定時間執行完畢,所以會有 pending 未確認狀態。
等待非同步行為執行完後,到 settled 已確認狀態之中會有兩種狀態。

  • fulfilled 已實現狀態,代表非同步行為已正確完成。會透過 resolve 回傳結果,再透過 then 來接收。
  • rejected 已否決狀態,代表非同步行為是失敗的。會透過 reject 回傳結果,使用 catsh 來接收。

範例

function promiseFn (num) {
    return new Promise((resolve, reject) => {
    setTimeout(() =>
        if (num) {
            resolve('成功');
        } else {
            reject(new Error('失敗"));
        }, 0);
    });
}

// 
promiseFn(1)
    .then((res) => {
        console.log( res)
    })
    .catch((err) => {
        console.error(err)
    });

先製作 function promiseFn 來傳遞成功或失敗的值,promiseFn 再來接收值及輸出結果。

鏈接技巧

// 增加帶入參數
function promiseFn (num) {
    return new Promise((resolve, reject) => {
    setTimeout(() =>
        if (num) {
            resolve(`成功 ${ num }`);
        } else {
            reject(new Error('失敗"));
        }, 0);
    });
}

// promise Chain
// 會依序執行,如要繼續執行,往下添加 then
promiseFn(1)
    .then((res) => {
        console.log(res)        
        return promiseFn(2) // 使用 return ,將下一個參數帶入
    })
    .then((res) => {
        console.log(res)        
        return promiseFn(3) // 使用 return ,將下一個參數帶入
    })
    .catch((err) => {
       console.log('catch', res)
       return promiseFn(4)  // 如果想要再失敗訊息後繼續執行,使用 return ,將下一個參數帶入
    })
    .then((res) => {
        console.log(res)        
        return promiseFn(5) 
    });
  • 使用鏈接方式,在 then 裡面將下一個參數帶入,就會執行下一個,並依序輸出。
  • 如果有錯誤,會停止之後串接的 then 。
  • then 是成功或失敗都會接收並執行,但常用在成功回傳上面。
  • 如果錯誤去執行 catsh 後想要繼續串接,使用 return ,將下一個參數帶入
  • 用此方是來鏈接 promise

上一篇
12. Promise
下一篇
14. 關注點分離 - forEach
系列文
JS 作品實戰應用 - Vue 電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言